import os
import logging
from logging.handlers import RotatingFileHandler
 
# 确保日志目录存在
log_dir = './log'
os.makedirs(log_dir, exist_ok=True)
 
class Loggers:
    def __init__(self, name, max_bytes=2*1024*1024, backup_count=10):
        # 创建一个字典来存储不同级别的日志文件路径
        self.log_files = {
            logging.INFO: os.path.join(log_dir, f'{name}_info.log'),
            logging.ERROR: os.path.join(log_dir, f'{name}_error.log'),
            logging.WARNING: os.path.join(log_dir, f'{name}_warning.log'),
            logging.DEBUG: os.path.join(log_dir, f'{name}_debug.log'),
            logging.CRITICAL: os.path.join(log_dir, f'{name}_critical.log')
        }
 
        # 创建一个字典来存储不同级别的日志记录器
        self.loggers = {}
 
        # 初始化日志器名称
        self.name = name
 
        # 最大字节数和备份数量
        self.max_bytes = max_bytes
        self.backup_count = backup_count
 
    def _get_level_map(self):
        # 将方法名映射到日志级别
        return {
            'info': logging.INFO,
            'error': logging.ERROR,
            'warning': logging.WARNING,
            'debug': logging.DEBUG,
            'critical': logging.CRITICAL
        }
 
    def _get_logger(self, level):
        # 如果日志记录器不存在，则创建它
        if level not in self.loggers:
            log_file = self.log_files[level]
            # 创建一个文件处理器，参数包括日志文件、最大字节数和备份数量
            handler = RotatingFileHandler(log_file, maxBytes=self.max_bytes, backupCount=self.backup_count, encoding='utf-8')
            # 创建一个格式化器，参数包括日志格式
            formatter = logging.Formatter('%(asctime)s - %(levelname)s - %(message)s')
            # 设置文件处理器的格式化器
            handler.setFormatter(formatter)
            
            # 获取日志器，参数为日志器名称
            logger = logging.getLogger(f"{self.name}_{level}")
            # 设置日志器的级别
            logger.setLevel(level)
            # 添加文件处理器到日志器
            logger.addHandler(handler)
            
            # 存储日志器
            self.loggers[level] = logger
        return self.loggers[level]
 
    def __getattr__(self, name):
        # 将方法调用映射到日志记录器
        if name in self._get_level_map():
            level = self._get_level_map()[name]
            return lambda message: self._get_logger(level).log(level, message)
        raise AttributeError(f"'Loggers' object has no attribute '{name}'")
 
# 示例使用
if __name__ == "__main__":
    # 初始化日志记录器
    loggers = Loggers("my_app")
 
    # 使用日志记录器
    loggers.info("This is an info message.")
    loggers.error("This is an error message.")
    # loggers.warning("This is a warning message.")
    # loggers.debug("This is a debug message.")
    # loggers.critical("This is a critical message.")